package cn.iocoder.yudao.module.pay.refund.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.api.pay.refund.dto.PayRefundCreateDTO;
import cn.iocoder.yudao.module.pay.refund.dal.dataobject.PayRefundDO;
import cn.iocoder.yudao.module.pay.refund.vo.PayRefundExportReqVO;
import cn.iocoder.yudao.module.pay.refund.vo.PayRefundPageReqVO;

import java.util.List;
import java.util.Map;

/**
 * 退款订单 Service 实现类
 *
 * @author aquan
 */
public interface PayRefundService {

    /**
     * 获得退款订单
     *
     * @param id 编号
     * @return 退款订单
     */
    PayRefundDO getRefund(Long id);

    /**
     * 获得退款订单
     *
     * @param no 统一退款单号
     * @return 退款订单
     */
    PayRefundDO getRefundByNo(String no);

    /**
     * 获得退款订单分页
     *
     * @param pageReqVO 分页查询
     * @return 退款订单分页
     */
    PageResult<PayRefundDO> getRefundPage(PayRefundPageReqVO pageReqVO);

    /**
     * 获得退款订单列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 退款订单列表
     */
    List<PayRefundDO> getRefundList(PayRefundExportReqVO exportReqVO);

    /**
     * 创建退款申请
     *
     * @param dto 退款申请信息
     * @return 退款单号
     */
    PayRefundDO createRefund(PayRefundCreateDTO dto);

    /**
     * 同步渠道退款的退款状态
     *
     * @return 同步到状态的退款数量，包括退款成功、退款失败
     */
    int syncRefund();

    /**
     * 退款通知
     *
     * @param channelCode 渠道编码
     * @param params 请求信息
     * @param body 请求信息
     * @param headers 请求信息
     * @return 回调结果
     */
    String notify(String channelCode, Map<String, String> params, String body, Map<String, String> headers);

}
